package com.cg.leetcode;

import org.junit.Test;

/**
 * 125.验证回文串
 *
 * @program: LeetCode->LeetCode_125
 * @description: 125.验证回文串
 * @author: cg
 * @create: 2021-08-31 17:08
 **/
public class LeetCode_125 {

    @Test
    public void test125() {
        System.out.println(isPalindrome("A man, a plan, a canal: Panama"));
    }

    /**
     * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
     * 说明：本题中，我们将空字符串定义为有效的回文串。
     *
     * 示例 1:
     * 输入: "A man, a plan, a canal: Panama"
     * 输出: true
     * 解释："amanaplanacanalpanama" 是回文串
     *
     * 示例 2:
     * 输入: "race a car"
     * 输出: false
     * 解释："raceacar" 不是回文串
     *
     * 提示：
     * 1) 1 <= s.length <= 2 * 10的5次幂
     * 2) 字符串 s 由 ASCII 字符组成
     * @param s
     * @return
     */
    public boolean isPalindrome(String s) {
        //双指针解决
        int left = 0, right = s.length() - 1;
        s = s.toLowerCase();
        while (left < right) {
            if (!Character.isLetterOrDigit(s.charAt(left))) {
                left ++;
                continue;
            }
            if (!Character.isLetterOrDigit(s.charAt(right))) {
                right --;
                continue;
            }
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left ++;
            right --;
        }
        return true;
    }
    /*public boolean isPalindrome(String s) {
        //正则解决
        String actual = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
        String rev = new StringBuffer(actual).reverse().toString();
        return actual.equals(rev);
    }*/

}
